home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 335_02 / as6811.y < prev    next >
Text File  |  1990-12-02  |  62KB  |  2,438 lines

  1. %{
  2.  
  3. /*
  4. HEADER:     ;
  5. TITLE:         Frankenstein Cross Assemblers;
  6. VERSION:     2.0;
  7. DESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  8.         Hex format object records.  ";
  9. KEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  10.         6811, tms7000, 8048, 8051, 8096, z8, z80;
  11. SYSTEM:     UNIX, MS-Dos ;
  12. FILENAME:     as6811.y;
  13. WARNINGS:     "This software is in the public domain.  
  14.         Any prior copyright claims are relinquished.  
  15.  
  16.         This software is distributed with no warranty whatever.  
  17.         The author takes no responsibility for the consequences 
  18.         of its use.
  19.  
  20.         Yacc (or Bison) required to compile."  ;
  21. SEE-ALSO:     as6811.doc,frasmain.c;    
  22. AUTHORS:     Mark Zenier;
  23. COMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  24.         (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  25. */
  26. /* 6811 instruction generation file */
  27. /* November 17, 1990 */
  28.  
  29. /*
  30.     description    frame work parser description for framework cross
  31.             assemblers
  32.     history        February 2, 1988
  33.             September 11, 1990 - merge table definition
  34.             September 12, 1990 - short file names
  35.             September 14, 1990 - short variable names
  36.             September 17, 1990 - use yylex as external
  37. */
  38. #include <stdio.h>
  39. #include "frasmdat.h"
  40. #include "fragcon.h"
  41.  
  42. #define yylex lexintercept
  43.  
  44. /*
  45.     file        fraselcrit.h
  46.     author        Mark Zenier
  47.     description    Selection criteria and token values for 6811
  48.             framework assembler
  49.     usage        framework cross assembler
  50.     history        September 19, 1987
  51. */
  52.  
  53.         /* 000000xxxx */
  54. #define CPUMASK        0xf
  55. #define CPU6800        0x1    /* cpuselect value in parser */
  56. #define CPU6801        0x3
  57. #define CPU6811        0x7
  58. #define TS6800PLUS    0x1    /* mask and match values in table */
  59. #define TS6801PLUS    0x2    /* if select value & mask == mask */
  60. #define TS6811        0x4
  61.  
  62.         /* 0000xx0000 */
  63. #define ACCREG        0x30
  64. #define REGA        0x10
  65. #define REGB        0x20
  66.  
  67.         /* 00xx000000 */
  68. #define INDREG        0xc0
  69. #define REGX        0x40
  70. #define REGY        0x80
  71.  
  72.         /* xx00000000 */
  73. #define ADDR        0x300
  74. #define DIRECT        0x100
  75. #define EXTENDED    0x200
  76.  
  77.  
  78. #define ST_ACC 0x1
  79. #define ST_AEXP 0x2
  80. #define ST_AIMM 0x4
  81. #define ST_AIND 0x8
  82. #define ST_BRSET 0x10
  83. #define ST_BSET 0x20
  84. #define ST_EXP 0x40
  85. #define ST_IBRSET 0x80
  86. #define ST_IBSET 0x100
  87. #define ST_IMM 0x200
  88. #define ST_IND 0x400
  89. #define ST_INDREG 0x800
  90. #define ST_INH 0x1000
  91.     
  92.     
  93.     int    cpuselect = CPU6811;
  94.     static char    genbdef[] = "[1=];";
  95.     static char    genwdef[] = "[1=]x";
  96.     char ignosyn[] = "[Xinvalid syntax for instruction";
  97.     char ignosel[] = "[Xinvalid operands/illegal instruction for cpu";
  98.  
  99.  
  100.     long    labelloc;
  101.     static int satsub;
  102.     int    ifstkpt = 0;
  103.     int    fraifskip = FALSE;
  104.  
  105.     struct symel * endsymbol = SYMNULL;
  106.  
  107. %}
  108. %union {
  109.     int    intv;
  110.     long     longv;
  111.     char    *strng;
  112.     struct symel *symb;
  113.     struct {int indexv, ex; } inetre;
  114. }
  115.  
  116. %token <intv> ACCUM
  117. %token <intv> INDEX
  118. %type <inetre> indexed
  119.  
  120. %token <intv> KOC_BDEF
  121. %token <intv> KOC_ELSE
  122. %token <intv> KOC_END
  123. %token <intv> KOC_ENDI
  124. %token <intv> KOC_EQU
  125. %token <intv> KOC_IF
  126. %token <intv> KOC_INCLUDE
  127. %token <intv> KOC_ORG
  128. %token <intv> KOC_RESM
  129. %token <intv> KOC_SDEF
  130. %token <intv> KOC_SET
  131. %token <intv> KOC_WDEF
  132. %token <intv> KOC_CHSET
  133. %token <intv> KOC_CHDEF
  134. %token <intv> KOC_CHUSE
  135. %token <intv> KOC_CPU
  136. %token <intv> KOC_opcode
  137.  
  138. %token <longv> CONSTANT
  139. %token EOL
  140. %token KEOP_AND
  141. %token KEOP_DEFINED
  142. %token KEOP_EQ
  143. %token KEOP_GE
  144. %token KEOP_GT
  145. %token KEOP_HIGH
  146. %token KEOP_LE
  147. %token KEOP_LOW
  148. %token KEOP_LT
  149. %token KEOP_MOD
  150. %token KEOP_MUN
  151. %token KEOP_NE
  152. %token KEOP_NOT
  153. %token KEOP_OR
  154. %token KEOP_SHL
  155. %token KEOP_SHR
  156. %token KEOP_XOR
  157. %token KEOP_locctr
  158. %token <symb> LABEL
  159. %token <strng> STRING
  160. %token <symb> SYMBOL
  161.  
  162. %token KTK_invalid
  163.  
  164. %right    KEOP_HIGH KEOP_LOW
  165. %left    KEOP_OR KEOP_XOR
  166. %left    KEOP_AND
  167. %right    KEOP_NOT
  168. %nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  169. %left    '+' '-'
  170. %left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  171. %right    KEOP_MUN
  172.  
  173.  
  174. %type <intv> expr exprlist stringlist
  175.  
  176. %start file
  177.  
  178. %%
  179.  
  180. file    :    file allline
  181.     |    allline
  182.     ;
  183.  
  184. allline    :     line EOL
  185.             {
  186.                 clrexpr();
  187.             }
  188.     |    EOL
  189.     |    error EOL
  190.             {
  191.                 clrexpr();
  192.                 yyerrok;
  193.             }
  194.     ;
  195.  
  196. line    :    LABEL KOC_END 
  197.             {
  198.                 endsymbol = $1;
  199.                 nextreadact = Nra_end;
  200.             }
  201.     |          KOC_END 
  202.             {
  203.                 nextreadact = Nra_end;
  204.             }
  205.     |    KOC_INCLUDE STRING
  206.             {
  207.         if(nextfstk >= FILESTKDPTH)
  208.         {
  209.             fraerror("include file nesting limit exceeded");
  210.         }
  211.         else
  212.         {
  213.             infilestk[nextfstk].fnm = savestring($2,strlen($2));
  214.             if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  215.                 ==(FILE *)NULL )
  216.             {
  217.                 fraerror("cannot open include file");
  218.             }
  219.             else
  220.             {
  221.                 nextreadact = Nra_new;
  222.             }
  223.         }
  224.             }
  225.     |    LABEL KOC_EQU expr 
  226.             {
  227.                 if($1 -> seg == SSG_UNDEF)
  228.                 {
  229.                     pevalexpr(0, $3);
  230.                     if(evalr[0].seg == SSG_ABS)
  231.                     {
  232.                         $1 -> seg = SSG_EQU;
  233.                         $1 -> value = evalr[0].value;
  234.                         prtequvalue("C: 0x%lx\n",
  235.                             evalr[0].value);
  236.                     }
  237.                     else
  238.                     {
  239.                         fraerror(
  240.                     "noncomputable expression for EQU");
  241.                     }
  242.                 }
  243.                 else
  244.                 {
  245.                     fraerror(
  246.                 "cannot change symbol value with EQU");
  247.                 }
  248.             }
  249.     |    LABEL KOC_SET expr 
  250.             {
  251.                 if($1 -> seg == SSG_UNDEF
  252.                    || $1 -> seg == SSG_SET)
  253.                 {
  254.                     pevalexpr(0, $3);
  255.                     if(evalr[0].seg == SSG_ABS)
  256.                     {
  257.                         $1 -> seg = SSG_SET;
  258.                         $1 -> value = evalr[0].value;
  259.                         prtequvalue("C: 0x%lx\n",
  260.                             evalr[0].value);
  261.                     }
  262.                     else
  263.                     {
  264.                         fraerror(
  265.                     "noncomputable expression for SET");
  266.                     }
  267.                 }
  268.                 else
  269.                 {
  270.                     fraerror(
  271.                 "cannot change symbol value with SET");
  272.                 }
  273.             }
  274.     |    KOC_IF expr 
  275.             {
  276.         if((++ifstkpt) < IFSTKDEPTH)
  277.         {
  278.             pevalexpr(0, $2);
  279.             if(evalr[0].seg == SSG_ABS)
  280.             {
  281.                 if(evalr[0].value != 0)
  282.                 {
  283.                     elseifstk[ifstkpt] = If_Skip;
  284.                     endifstk[ifstkpt] = If_Active;
  285.                 }
  286.                 else
  287.                 {
  288.                     fraifskip = TRUE;
  289.                     elseifstk[ifstkpt] = If_Active;
  290.                     endifstk[ifstkpt] = If_Active;
  291.                 }
  292.             }
  293.             else
  294.             {
  295.                 fraifskip = TRUE;
  296.                 elseifstk[ifstkpt] = If_Active;
  297.                 endifstk[ifstkpt] = If_Active;
  298.             }
  299.         }
  300.         else
  301.         {
  302.             fraerror("IF stack overflow");
  303.         }
  304.             }
  305.                         
  306.     |    KOC_IF 
  307.             {
  308.         if(fraifskip) 
  309.         {
  310.             if((++ifstkpt) < IFSTKDEPTH)
  311.             {
  312.                     elseifstk[ifstkpt] = If_Skip;
  313.                     endifstk[ifstkpt] = If_Skip;
  314.             }
  315.             else
  316.             {
  317.                 fraerror("IF stack overflow");
  318.             }
  319.         }
  320.         else
  321.         {
  322.             yyerror("syntax error");
  323.             YYERROR;
  324.         }
  325.                 }
  326.                         
  327.     |    KOC_ELSE 
  328.             {
  329.                 switch(elseifstk[ifstkpt])
  330.                 {
  331.                 case If_Active:
  332.                     fraifskip = FALSE;
  333.                     break;
  334.                 
  335.                 case If_Skip:
  336.                     fraifskip = TRUE;
  337.                     break;
  338.                 
  339.                 case If_Err:
  340.                     fraerror("ELSE with no matching if");
  341.                     break;
  342.                 }
  343.             }
  344.  
  345.     |    KOC_ENDI 
  346.             {
  347.                 switch(endifstk[ifstkpt])
  348.                 {
  349.                 case If_Active:
  350.                     fraifskip = FALSE;
  351.                     ifstkpt--;
  352.                     break;
  353.                 
  354.                 case If_Skip:
  355.                     fraifskip = TRUE;
  356.                     ifstkpt--;
  357.                     break;
  358.                 
  359.                 case If_Err:
  360.                     fraerror("ENDI with no matching if");
  361.                     break;
  362.                 }
  363.             }
  364.     |    LABEL KOC_ORG expr 
  365.             {
  366.                 pevalexpr(0, $3);
  367.                 if(evalr[0].seg == SSG_ABS)
  368.                 {
  369.                     locctr = labelloc = evalr[0].value;
  370.                     if($1 -> seg == SSG_UNDEF)
  371.                     {
  372.                         $1 -> seg = SSG_ABS;
  373.                         $1 -> value = labelloc;
  374.                     }
  375.                     else
  376.                         fraerror(
  377.                         "multiple definition of label");
  378.                     prtequvalue("C: 0x%lx\n",
  379.                         evalr[0].value);
  380.                 }
  381.                 else
  382.                 {
  383.                     fraerror(
  384.                      "noncomputable expression for ORG");
  385.                 }
  386.             }
  387.     |          KOC_ORG expr 
  388.             {
  389.                 pevalexpr(0, $2);
  390.                 if(evalr[0].seg == SSG_ABS)
  391.                 {
  392.                     locctr = labelloc = evalr[0].value;
  393.                     prtequvalue("C: 0x%lx\n",
  394.                         evalr[0].value);
  395.                 }
  396.                 else
  397.                 {
  398.                     fraerror(
  399.                      "noncomputable expression for ORG");
  400.                 }
  401.             }
  402.     |    LABEL KOC_CHSET
  403.             {
  404.                 if($1 -> seg == SSG_UNDEF)
  405.                 {
  406.                     $1 -> seg = SSG_EQU;
  407.                     if( ($1->value = chtcreate()) <= 0)
  408.                     {
  409.         fraerror( "cannot create character translation table");
  410.                     }
  411.                     prtequvalue("C: 0x%lx\n", $1 -> value);
  412.                 }
  413.                 else
  414.                 {
  415.             fraerror( "multiple definition of label");
  416.                 }
  417.             }
  418.     |        KOC_CHUSE
  419.             {
  420.                 chtcpoint = (int *) NULL;
  421.